﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using IndustryWrapper;

namespace IndustryWrapper
{
    /// <summary>
    /// 运控封包库的的全局变量
    /// 整个库的实例都应该放在这边
    /// </summary>
    public class CGlbMc
    {
        //0代表初始化成功 ！=0代表失败
        private static int initRst = 0;
        //存粹注册用 没实际意义
        private static CCmdRegeister register = new CCmdRegeister();
        //轴配置
        public static CAxisConfige axisPrm = null;// (CAxisConfige)CXmlSaveRead.read(@"confige\axis.xml", typeof(CAxisConfige));
        //坐标系参数
        public static CCrdPrm crdPrm = null;// (CCrdPrm)CXmlSaveRead.read(@"confige\crd.xml", typeof(CCrdPrm));
        //电子凸轮参数
        public static CCamPrm camPrm = null;// = new CCamPrm();
        //IO配置
        public static CIoConfige ioPrm = null;//= new CIoConfige();
        //控制器硬件配置
        public static CMotionHardConfige hardPrm = null;// new CMotionHardConfige();
        /// 运动控制器的实体
        public static CMotionManager mc = null;// new CMotionManager(hardPrm);
        /// 整个设备的管理器，内部可能包含了非常多的并行组件
        public static CMachManager machMng = null;// new CMachManager();
        /// <summary>
        /// 确保这个静态构造函数永远实在第一个被构造的
        /// </summary>
        static CGlbMc()
        {
            //必须
            object p1 = CXmlSerializerManager.read(CAxisConfige.defaultfn, typeof(CAxisConfige));
            if (p1 == null) 
                CDebug.log.add("读取轴配置文件错误!");
            else
                axisPrm = (CAxisConfige)p1;
            //TODO:io的保存也要支持导出和修改
            //io配置
            ioPrm = new CIoConfige();
            if(!ioPrm.readfromcsv())
                CDebug.log.add("读取IO配置文件错误!");
            //非必须
            object p3 = CXmlSerializerManager.read(CCrdPrm.defaultfn, typeof(CCrdPrm));
            if(p3 == null)
                CDebug.log.add("读取坐标系配置文件错误!");
            else
                crdPrm = (CCrdPrm)p3;
            //cam
            object p4 = CXmlSerializerManager.read(CCamPrm.defaultfn, typeof(CCamPrm));
            if (p4 == null)
                CDebug.log.add("读取凸轮表配置文件错误!");
            else
                camPrm = (CCamPrm)p4;
            //硬件配置
            hardPrm = new CMotionHardConfige();
            if(!hardPrm.readfromxml())
                CDebug.log.add("读取硬件配置文件错误!");
            if(hardPrm != null)
                mc = new CMotionManager(hardPrm);
            
            machMng = new CMachManager();
            //初始化指令集
            CBuffCmdBase.Init();
            //保存log信息
            CDebug.log.save();
        }
        /// <summary>
        /// 全局的初始化
        /// 这个要在其他模块都已经加载进来后才调用
        /// </summary>
        public static void Init()
        {
            machMng.Module_Start();
        }
        public static void UnInit()
        {
            if (machMng != null) 
                machMng.Module_Stop();
            if (mc != null)
                mc.UnInit();
        }
    }

}
